package cmd

import (
	"fmt"
	"log"

	"github.com/spf13/cobra"

	"github.com/gin-gonic/gin"
	"pets.ser163.cn/config"
	"pets.ser163.cn/database"
	"pets.ser163.cn/events"
	"pets.ser163.cn/middleware"
	"pets.ser163.cn/routers"
	"pets.ser163.cn/tasks"

	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
)

var serveCmd = &cobra.Command{
	Use:   "serve",
	Short: "Start the web server",
	Run: func(cmd *cobra.Command, args []string) {
		log.Println("Starting server...")
		// 服务器启动逻辑
		start()
	},
}

func init() {
	rootCmd.AddCommand(serveCmd)
}

// 启动服务器
func start() {
	// 设置 Gin 的运行模式
	gin.SetMode(config.ConfigInstance.Server.Mode)

	// Initialize database
	database.InitDatabase()

	// 初始化事件总线
	events.Init()

	// Start cron jobs
	tasks.StartCron()

	// 设置路由
	r := gin.Default()

	// 设置静态文件目录
	r.Static("/static", "./static")

	// 添加Swagger路由
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	// Setup router
	routers.InitAPIRoutes(r)

	// 使用全局中间件
	r.Use(middleware.Logger())

	// 启动服务器
	address := fmt.Sprintf("%s:%d", config.ConfigInstance.Server.Address, config.ConfigInstance.Server.Port)
	log.Printf("Starting server at %s", address)
	r.Run(address)
}
